
const fse = require('fs-extra');

const selfsigned = require('selfsigned');

function createCertificate(attributes) {
  return selfsigned.generate(attributes, {
    algorithm: 'sha256',
    days: 30,
    keySize: 2048,
    extensions: [
      {
        name: 'basicConstraints',
        cA: true,
      },
      {
        name: 'keyUsage',
        keyCertSign: true,
        digitalSignature: true,
        nonRepudiation: true,
        keyEncipherment: true,
        dataEncipherment: true,
      },
      {
        name: 'extKeyUsage',
        serverAuth: true,
        clientAuth: true,
        codeSigning: true,
        timeStamping: true,
      },
      {
        name: 'subjectAltName',
        altNames: [
          {
            // type 2 is DNS
            type: 2,
            value: 'localhost',
          },
          {
            type: 2,
            value: 'localhost.localdomain',
          },
          {
            type: 2,
            value: 'lvh.me',
          },
          {
            type: 2,
            value: '*.lvh.me',
          },
          {
            type: 2,
            value: '[::1]',
          },
          {
            // type 7 is IP
            type: 7,
            ip: '127.0.0.1',
          },
          {
            type: 7,
            ip: 'fe80::1',
          },
        ],
      },
    ],
  });
}

module.exports = {
    // 判断路径是否存在
    isPathExist: (filePath) => {
        let isExist = true;

        try {
            fse.accessSync(filePath, fse.constants.R_OK | fse.constants.W_OK);
        }
        catch {
            isExist = false;
        }

        return isExist;
    },
    // 获取请求参数，不论是请求body还是url上的
    getParam: (ctx) => {
        const body = ctx.request.body;
        const querystring = ctx.querystring;

        let param = {};

        if(body) {
            param = {
                ...body
            }
        }
        if(querystring) {
            querystring.split('&').forEach((item) => {
                let data = item.split('=');
                param[data[0]] = data[1];
            });
        }

        return param;
    },
    // 生成证书
    createCertificate: createCertificate
}